#ifndef QUEUE_H
#define QUEUE_H

#include <stdint.h>

typedef struct {
	volatile uint16_t length;		//数据量
	volatile uint16_t maxLength;	//最大数据量
	volatile uint16_t head;			//头索引
	volatile uint16_t tail;			//尾索引
	uint8_t  dataArr[0];			//数据，类型是uint8_t
} QUEUE;

//函数状态返回
typedef enum {
	Q_OK = 0,	//操作成功
	Q_EMPTY,	//操作失败，队列为空
	Q_FULL,		//操作失败，队列为满
	Q_ERROR		//操作失败，其他原因
} Q_RETURN;

/******************************************************************************
 *函数名称：  queueInit
 *输入参数：  mem,连续的内存块地址，可以是数组，也可以是malloc分配的内存
 *            len,内存块size，不能比结构体QUEUE小
 *  		  typeSize,数据占内存大小
 *输出参数：  无
 *返回值  ：  Q_OK，初始化成功；Q_ERROR，初始化失败
 *功能描述：  初始化队列
 ******************************************************************************/
Q_RETURN queueInit(void* mem, int len, uint8_t typeSize);

/******************************************************************************
 *函数名称：  queueClear
 *输入参数：  mem,连续的内存块地址，可以是数组，也可以是malloc分配的内存
 *输出参数：  无
 *返回值  ：  Q_OK，初始化成功；Q_ERROR，初始化失败
 *功能描述：  清空队列
 ******************************************************************************/
Q_RETURN queueClear(void* mem);

/******************************************************************************
 *函数名称：  queuePush
 *输入参数：  mem,连续的内存块地址，可以是数组，也可以是malloc分配的内存
 *			  data,输入的数据
 * 			  typeSize,数据占内存大小
 *输出参数：  无
 *返回值  ：  Q_OK，写入成功；Q_FULL，队列满，写入失败
 *功能描述：  插入数据
 ******************************************************************************/
Q_RETURN queuePush(void* mem, const void *data, uint8_t typeSize);

/******************************************************************************
 *函数名称：  queuePull
 *输入参数：  mem,连续的内存块地址，可以是数组，也可以是malloc分配的内存
 * 			  typeSize,数据占内存大小
 *输出参数：  data,读取的数据
 *返回值  ：  Q_OK，读取成功；Q_EMPTY，队列空，读取失败
 *功能描述：  读取数据
 ******************************************************************************/
Q_RETURN queuePull(void* mem, void *data, uint8_t typeSize);

#endif

